package com.util.boxs.bodys;

import com.sun.istack.internal.NotNull;
import com.util.boxs.BoxWorld;
import org.jbox2d.dynamics.Body;
import org.jbox2d.dynamics.BodyType;
import org.jbox2d.dynamics.Fixture;
import org.jbox2d.dynamics.FixtureDef;

public abstract class BaseBody extends BoxWorld {
    //屏幕尺度对应的属性
    protected int pixelX;
    protected int pixelY;
    @NotNull
    protected  Body body;

    protected int color;
    protected FixtureDef fixtureDef;//夹具定义

    /**
     * 返回一个默认的夹具定义
     * @return
     */
    protected FixtureDef getDefaultFixtureDef(){
        FixtureDef fd = new FixtureDef();
        fd.density = 1f;//密度
        fd.friction = 0.5f;//摩擦力
        fd.restitution = 0.5f;//恢复
        return fd;
    }

    public Body getBody() {
        return body;
    }

    public void setBody(Body body) {
        this.body = body;
    }

    public int getColor() {
        return color;
    }

    public void setColor(int color) {
        this.color = color;
    }

    /**
     * 判断是否为当前刚体
     * @param fixture
     * @return
     */
    public boolean isMe(Fixture fixture){
        return fixture.m_body==body;
    }
    /**
     * 判断是否为当前刚体
     * @param body
     * @return
     */
    public boolean isMe(Body body){
        return this.body==body;
    }

    /**
     * 以屏幕像素坐标设置刚体位置
     * @param pixelX
     * @param pixelY
     */
    public abstract void setPosition(int pixelX,int pixelY);

    /**
     * 设置刚体为静态的，反之则是动态的
     * @param aStatic
     */
    public void setStatic(boolean aStatic) {
        body.setType(aStatic? BodyType.STATIC:BodyType.DYNAMIC);
    }

    /**
     * 是否为静态刚体
     * @return
     */
    public boolean isStatic(){
        return body.getType()==BodyType.STATIC;
    }

    /**
     * 返回刚体在以屏幕像素坐标的中心点x坐标
     * @return
     */
    public int getPixelCenterX(){
        return mile2Pixel(body.getPosition().x);
    }
    /**
     * 返回刚体在以屏幕像素坐标的中心点y坐标
     * @return
     */
    public int getPixelCenterY(){
        return toPixelHeight(body.getPosition().y);
    }

    /**
     * 返回刚体在以屏幕像素坐标的左上点x坐标
     * @return
     */
    public abstract int getPixelX();
    /**
     * 返回刚体在以屏幕像素坐标的左上点Y坐标
     * @return
     */
    public abstract int getPixelY();

    /**
     * 设置中心点的坐标
     * @param pixelX
     * @param pixelY
     */
    public void setCenterPosition(int pixelX, int pixelY){
        body.setTransform(getPixel2MileVec2(pixelX,pixelY),body.getAngle());
    }

    /**
     * 沿着中心点旋转指定角度
     * @param angle
     */
    public void rotate(int angle){
        body.setTransform(body.getPosition(),(float) Math.toRadians(-angle));
    }

    /**
     * 指定一个向量位置的加速度
     * 该方法调用后会将当前刚体设置为动态的。
     * @param x
     * @param y
     */
    public void setLinearVelocity(int x,int y){
        body.setType(BodyType.DYNAMIC);
        body.setLinearVelocity(getPixel2MileVec2(x,y));
    }

    /**
     * 是否已经出了世界
     * @return
     */
    public boolean isOutOfBounds(){
        return BoxWorld.isOutOfWorld(getBody());
    }

}
